/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package formula.one.urjc.dueño.controlador;

import formula.one.urjc.Metodos;
import formula.one.urjc.dueño.view.VentanaDueñoFichaje;
import formula.one.urjc.dueño.view.ventanaAviso;
import formula.one.urjc.escuderia.Escuderia;
import formula.one.urjc.piloto.Piloto;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author javier
 */
public class DueñoEscuderiaFichajeControlador implements ActionListener{
    VentanaDueñoFichaje vista;
    DueñoEscuderiaContolador controlPadre;
    Metodos modelo;
    ArrayList<Object> pilotosLibres;
    ArrayList<Object> pilotosOtrasEscuderias;
    Escuderia escuderia;
    
    public DueñoEscuderiaFichajeControlador(Metodos modelo, Escuderia escuderia) {
        this.modelo = modelo;
        vista=new VentanaDueñoFichaje();
        this.escuderia=escuderia;
        //añado las accines a los botones del formulario
        vista.getjBtFichar().addActionListener(this);
        vista.getjBtDespedir().addActionListener(this);
        vista.getjBtIntercambio().addActionListener(this);
       
    }
    
    
     //método para mostra la pantalla
    public VentanaDueñoFichaje mostrarPantalla(){
        //aplico las propiedades a la vantana
        //que no se pueda cambiar el tamaño
        vista.setResizable(false);
        // que se muestre
        vista.setVisible(true);
        cargarDatos();
        return vista;
        
    }
    //método que muestra los pilotos en la lista corerspondiente
   public void cargarPilotosLibres(){
       //cargo el objeto pilotos con todos los que existan en el  
       pilotosLibres=modelo.getPilotoList();
        for (int i=0;i<pilotosLibres.size();i++){
           vista.getModelPilotosLibres().addElement(((Piloto)pilotosLibres.get(i)).resumeToString());
        }
        vista.getjListPilotosLibres().setModel(vista.getModelPilotosLibres());
        
    }
   
   public void cargarPilotosOfic(){
       if (escuderia.getPilotosOficiales()!=null){
           for (int i=0;i<escuderia.getPilotosOficiales().size();i++){
            vista.getModelMisPiltosoOfic().addElement(((Piloto)escuderia.getPilotosOficiales().get(i)).resumeToString());
           }
           vista.getjListPilotosOficiales().setModel(vista.getModelMisPiltosoOfic());
       }
       
   }
   
    public void cargarPilotosProb(){
       if (escuderia.getPilotosProbadores()!=null){
           for (int i=0;i<escuderia.getPilotosProbadores().size();i++){
            vista.getModelMisPilotosProbadores().addElement(((Piloto)escuderia.getPilotosProbadores().get(i)).resumeToString());
           }
           vista.getjListPilotoProbador().setModel(vista.getModelMisPilotosProbadores());
       }
       
   }
    
    public void cargarPilotosOtras(){
        pilotosOtrasEscuderias=new ArrayList<Object>();
        ArrayList<Object> escuderias=modelo.getEscuderiasList();
        for (int i=0; i< escuderias.size();i++){
            if(!((Escuderia)escuderias.get(i)).getNombre().equals(escuderia.getNombre())){
                //añado pilotos oficiales
                if(((Escuderia)escuderias.get(i)).getPilotosOficiales()!=null){
                    
                    for(int a=0;a<((Escuderia)escuderias.get(i)).getPilotosOficiales().size();a++){
                         pilotosOtrasEscuderias.add(((Escuderia)escuderias.get(i)).getPilotosOficiales().get(a));
                         vista.getModelOtrosPilotos().addElement(((Escuderia)escuderias.get(i)).getNombre()+"- PO:"+((Escuderia)escuderias.get(i)).getPilotosOficiales().get(a).getNombre()+" Sueldo:"+String.format("%.1f",((Escuderia)escuderias.get(i)).getPilotosOficiales().get(a).getSueldo()));
                    }
                }
                //añado pilotos probadores
                if(((Escuderia)escuderias.get(i)).getPilotosProbadores()!=null){
                    //añado pilotos oficiales
                    for(int a=0;a<((Escuderia)escuderias.get(i)).getPilotosProbadores().size();a++){
                         pilotosOtrasEscuderias.add(((Escuderia)escuderias.get(i)).getPilotosProbadores().get(a));
                         vista.getModelOtrosPilotos().addElement(((Escuderia)escuderias.get(i)).getNombre()+"- PP:"+((Escuderia)escuderias.get(i)).getPilotosProbadores().get(a).resumeToString()+" Sueldo:"+String.format("%.1f",((Escuderia)escuderias.get(i)).getPilotosProbadores().get(a).getSueldo()));
                    }
                }
               
            }
        }
        vista.getjListPilotosConEscuderia().setModel(vista.getModelOtrosPilotos());
    }
    
   public void cargarPresupuesto(){
       //cargo presupuesto
       vista.getjTextPresupuesto().setText(Double.toString(escuderia.getPresupuesto()));
   }
   
   public void cargarDatos(){
     //cargo presupuesto
        cargarPresupuesto();
        
        vista.getModelPilotosLibres().clear();
        //cargo los datos de la escuderias correspondiente
        cargarPilotosLibres();
        
        vista.getModelMisPiltosoOfic().clear();
        //cargo pilotos oficiales
        cargarPilotosOfic();
        
        vista.getModelMisPilotosProbadores().clear();
        //cargo pilotos probadores
        cargarPilotosProb();
        
        vista.getModelOtrosPilotos().clear();
        //cargo piltos de otras escuderias
        cargarPilotosOtras();
        
    }
   //comprobación de la selección que se ha realizado a la hora de despedir
   private int comprobarSeleccionFichar() {
       int res=-1;
       //si hay pilotos seleccionados en otras escuderias y en libres a la vez existe ambiguedad
       if(!vista.getjListPilotosLibres().isSelectionEmpty() && !vista.getjListPilotosConEscuderia().isSelectionEmpty()){
           res =-1;
            ventanaAviso.mostrarError(vista,"Debe de Deseleccionar un piloto en Libres o en Otras escuderias","Error Fichaje");
       //si no hay pilotos seleccionados en otras escuderias y en libres existe ambiguedad
       }else if(vista.getjListPilotosLibres().isSelectionEmpty() && vista.getjListPilotosConEscuderia().isSelectionEmpty()){
           res=-1;
            ventanaAviso.mostrarError(vista,"Debe de seleccionar un piloto en Libres o en Otras escuderias","Error Fichaje");
        //Si la seleccion es de pilotos libres     
       }else if(!vista.getjListPilotosLibres().isSelectionEmpty()&& vista.getjListPilotosConEscuderia().isSelectionEmpty()){
           res=0;
       }else if(!vista.getjListPilotosConEscuderia().isSelectionEmpty()&&vista.getjListPilotosLibres().isSelectionEmpty()){
           res=1;
       }
       
       return res;
    }
   //comprobación que se realiza de la selección hecha  ala hora de despedir
   private boolean comprobarSeleccionDespedir(){
       boolean res=false;
       if(vista.getjListPilotosOficiales().isSelectionEmpty() && vista.getjListPilotoProbador().isSelectionEmpty()){
           res=false;
           ventanaAviso.mostrarError(vista,"Debe de seleccionar un piloto Oficial o Probador","Error Fichaje");
       }else if(!vista.getjListPilotosOficiales().isSelectionEmpty() && !vista.getjListPilotoProbador().isSelectionEmpty()){
           res=false;
           ventanaAviso.mostrarError(vista,"Debe de elegir únicamente un piloto Oficial o un Probador","Error Fichaje");
       }else{
           res=true;
       }
       return res;
   }
   
   private boolean comprobarSeleccionIntercambio(){
       boolean res=false;
       //compruebo que únicamente esté seleccionado un piloto en Pilotos con Escuderia
       int fichaje=comprobarSeleccionFichar();
       if(fichaje==1){
           //compruebo que únicamente esté seleccionado un piloto en Pilotos Oficiales o Pilotos Probadores
           if(comprobarSeleccionDespedir()){
               //si es así la selección es correcta para hacer el intercambio
               res=true;
           }
       }
      
       
       return res;
   }
   
   private Escuderia getEscuderiaPilotoSeleccionado(){
       /*lo primero es obtener la escuderia a la que pertenece el piloto que se quiere fichar
        * para ello se obtine el nombre a través del listado, que tiene un patron Nombre escuderia-NombrePiloto,
        * tomare el texto seleccionado, y haré un split por "-" para quedarme con el primer elemento que es el nombre escuderia
        */
        String[] partes=vista.getjListPilotosConEscuderia().getSelectedValue().toString().split("-");
        String nombreEsc=partes[0];
        /*
        * Luego obtendre el objeto llamando al metodo del modelo getescuderia
         */
        Escuderia esc=modelo.getEscuderia(nombreEsc);
        return esc;
   }
   
   /*
    * metodo que permite fichar un piloto
    * el entero acción representa si se ficha un piloto libre (0) o un piloto de otra escuderia (1)
    * la cadena tipo representa si se quiere fichar como piloto oficial (Ofcial) o como probador (Probador)
    */
   private void ficharPiloto(int accion, String tipo) {
       int nTipo=0;
       //codifico la tipología del piloto según si es oficial o probador
       if(tipo.equals("Oficial")){
           nTipo=0;
       }else{
           nTipo=1;
       }
       switch(accion){
           //si se trata de fichar un piloto libre
           case 0:
               /*ficho piloto, lepaso como parametros:
                * piloto: aparece del array cargado al crear la ventana. Estos tienen los mismo indices que la lsita de la vista. Tengo que ahcer uncasting a piloto ya que devuelve objetos
                * tipo de piloto: depende de la forma en que se quiere fichar, como oficial(0) o probador(1)
                * escuderia:como se trata de un piloto libre no tiene escuderia, se pasa null
                */
               if(!escuderia.ficharPiloto((Piloto)pilotosLibres.get(vista.getjListPilotosLibres().getSelectedIndex()), nTipo, null)){
                   ventanaAviso.mostrarError(vista,"No se ha podido Realizar el fichaje por falta de presupuesto","Error Fichaje");
               }else{
                   //se modfica nuestra escuderia en el archivo
                   modelo.modificarEscuderia(escuderia);
                   //borro al piloto del fichero
                   modelo.eliminarPiloto(((Piloto)pilotosLibres.get(vista.getjListPilotosLibres().getSelectedIndex())).getNombre(),
                           ((Piloto)pilotosLibres.get(vista.getjListPilotosLibres().getSelectedIndex())).getApellidos());
               }
               
               break;
           //si se trata de fichar un piloto con escuderia
           case 1:
               /*lo primero es obtener la escuderia a la que pertenece el piloto que se quiere fichar
                * para ello se obtine el nombre a través del listado, que tiene un patron Nombre escuderia-NombrePiloto,
                * tomare el texto seleccionado, y haré un split por "-" para quedarme con el primer elemento que es el nombre escuderia
                */
               //String[] partes=vista.getjListPilotosConEscuderia().getSelectedValue().toString().split("-");
               //String nombreEsc=partes[0];
               /*
                * Luego obtendre el objeto llamando al metodo del modelo getescuderia
                */
               //Escuderia esc=modelo.getEscuderia(nombreEsc);
               Escuderia esc=getEscuderiaPilotoSeleccionado();
               //debe devolver algo, pero para evitar errores
               if(esc!=null){
                   //el piloto lo selecciono de forma identica a la anterior
                    if(!escuderia.ficharPiloto((Piloto)pilotosOtrasEscuderias.get(vista.getjListPilotosConEscuderia().getSelectedIndex()), nTipo, esc)){
                      ventanaAviso.mostrarError(vista,"No se ha podido Realizar el fichaje por falta de presupuesto","Error Fichaje");  
                    }else{
                        //se modfica nuestra escuderia en el archivo
                        modelo.modificarEscuderia(escuderia);
                        esc.despedirPiloto((Piloto)pilotosOtrasEscuderias.get(vista.getjListPilotosConEscuderia().getSelectedIndex()));
                        //se modifica la escuderia a la que pertenecia el piloto
                        modelo.modificarEscuderia(esc);
                    }
               }
              
               break;
       }
       //cargo de nuevo los listados
       cargarDatos();
       
    }

    //método que gestiona las acciones de los botones del formulario
    @Override
    public void actionPerformed(ActionEvent ae) {
       //botón fichar
        if(vista.getjBtFichar()==ae.getSource()){
           //compruebo que se pueda fichar y de ser así de donde
           int accion=comprobarSeleccionFichar();
           //si se puede fichar
           if(accion>-1){
              // muestro una ventana para que se elija cómo se quiere fichar al piloto corresppondiente
                Object seleccion = JOptionPane.showInputDialog(vista,"¿Cómo lo quiere fichar al piloto?","Selección",JOptionPane.QUESTION_MESSAGE,null,
                new Object[] { "Oficial", "Probador"},"Oficial");
                //si se ha elegido un tipo
                if(seleccion!=null){
                    if(seleccion.equals("Oficial")){
                        //se comprueba si hay sitio en el equipo
                        if(escuderia.getPilotosOficiales().size()<2){
                            ficharPiloto(accion, seleccion.toString());
                        }else{
                            ventanaAviso.mostrarError(vista, "No se pueden fichar más pilotos oficiales", "Error fichaje");
                        }
                    }else{
                         //se comprueba si hay sitio en el equipo
                        if(escuderia.getPilotosProbadores().size()<2){
                             ficharPiloto(accion, seleccion.toString());
                        }else{
                            ventanaAviso.mostrarError(vista, "No se pueden fichar más pilotos probadores", "Error fichaje");
                        }
                    }
                }
                
           }
           //botón despedir
       }else if(vista.getjBtDespedir()==ae.getSource()){
           //hago la comprobación de que la selección sea correcta
           if(comprobarSeleccionDespedir()){
               //si se ha seleccionado un piloto probador
               if(vista.getjListPilotosOficiales().isSelectionEmpty()){
                   //pido confirmación
                   int confirmacion=ventanaAviso.mostrarConfirmacion(vista, "¿Está seguro de despedir al piloto Probador " + escuderia.getPilotosProbadores().get(vista.getjListPilotoProbador().getSelectedIndex()).getNombre(),
                           "Confirmación de despido");
                   if(JOptionPane.OK_OPTION==confirmacion){
                       //lo escribo en el archivo de pilotos
                       modelo.escribirFichero("pilotos.dat", (Piloto)escuderia.getPilotosProbadores().get(vista.getjListPilotoProbador().getSelectedIndex()));
                       //despido
                       escuderia.despedirPiloto(escuderia.getPilotosProbadores().get(vista.getjListPilotoProbador().getSelectedIndex()));
                       //modifico la escuderia en el archivo
                       modelo.modificarEscuderia(escuderia);
                       //cargo de nuevo los datos
                       cargarDatos();
                   }
                   
               //si se ha seleccionado un piloto Oficial
               }else{
                   int confirmacion=ventanaAviso.mostrarConfirmacion(vista, "¿Está seguro de despedir al piloto Oficial " + escuderia.getPilotosOficiales().get(vista.getjListPilotosOficiales().getSelectedIndex()).getNombre(),
                           "Confirmación de despido");
                   if(JOptionPane.OK_OPTION==confirmacion){
                       //lo escribo en el archivo de pilotos
                       modelo.escribirFichero("pilotos.dat", (Piloto)escuderia.getPilotosOficiales().get(vista.getjListPilotosOficiales().getSelectedIndex()));
                       //despido
                       escuderia.despedirPiloto(escuderia.getPilotosOficiales().get(vista.getjListPilotosOficiales().getSelectedIndex()));
                       //modifico la escuderia en el archivo
                       modelo.modificarEscuderia(escuderia);
                       //cargo de nuevo los datos
                       cargarDatos();
                   }  
                   
               }
           }
       //botón intercambio
       }else if(vista.getjBtIntercambio()==ae.getSource()){
           if(comprobarSeleccionIntercambio()){
               Piloto pB=null;
               //obtengo el piloto de la otra escuderia
               pB=(Piloto)pilotosOtrasEscuderias.get(vista.getjListPilotosConEscuderia().getSelectedIndex());
               
              
               //obtengo la escuderia del piloto B 
               Escuderia escB=getEscuderiaPilotoSeleccionado();
                Piloto pA=null;
               //si está seleccionado un piloto probador
               if(vista.getjListPilotosOficiales().isSelectionEmpty()){
                   pA=escuderia.getPilotosProbadores().get(vista.getjListPilotoProbador().getSelectedIndex());
                  
               }else{
                   pA=escuderia.getPilotosOficiales().get(vista.getjListPilotosOficiales().getSelectedIndex());
               
               }
               //hago el intercambio
               if(!escuderia.cambiarPiloto(pA, pB, escB)){
                 //si no se puede doy el error
                   ventanaAviso.mostrarError(vista, "No se ha podido hacer el intercambio por que entre los pilotos hay una diferencia > 10%", "Error intercambio");
               }else{
                   //se modifican ambas escuderias
                   modelo.modificarEscuderia(escB);
                   modelo.modificarEscuderia(escuderia);
                   //se cargan los datos
                   cargarDatos();
               }
           }
       }
    }

    
    

    
    
}
